.TITLE DRATX .IDENT /09.03/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 08.04 ; ; D. N. CUTLER 31-AUG-73 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; J. M. LAWLER ; T. M. MARTIN ; B. S. MCCARTHY ; ; MODIFIED BY: ; ; B. S. MCCARTHY 30-MAY-84 09.01 ; ; BM309 -- REMOVE REFERENCES TO $HEADR TO ; STREAMLINE CODE ; ; B. S. MCCARTHY 15-JUN-84 09.02 ; ; BM309 -- CORRECT TYPO IN ABOVE ; ; B. S. MCCARTHY 16-OCT-84 09.03 ; ; BM321 -- ANOTHER CORRECTION TO ABOVE ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,HDRDF$,HWDDF$,TCBDF$ ABODF$ ;DEFINE TASK ABORT CODES HDRDF$ ;DEFINE TASK HEADER OFFSETS HWDDF$ ;DEFINE HARDWARE REGISTERS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;+ ; **-$DRATX-AST SERVICE EXIT ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF AN ; ASYNCHRONOUS SYSTEM TRAP SERVICE ROUTINE. IF ANOTHER AST IS QUEUED AND ; AST'S ARE NOT DISABLED, THEN THE NEXT AST IS EFFECTED IMMEDIATELY. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(115.),DPB SIZE(1.). ; ; AT ISSUANCE THE TASK STACK CONTAINS: ; ; 14(SP)=EVENT FLAG MASK WORD FOR FLAGS 1.-16. ; 12(SP)=EVENT FLAG MASK WORD FOR FLAGS 17.-32. ; 10(SP)=EVENT FLAG MASK WORD FOR FLAGS 33.-48. ; 06(SP)=EVENT FLAG MASK WORD FOR FLAGS 49.-64. ; 04(SP)=PRE AST TASK PS. ; 02(SP)=PRE AST TASK PC. ; 00(SP)=PRE AST TASK DIRECTIVE STATUS WORD. ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF PRE AST STATE IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE DIRECTIVE ; WAS NOT EXECUTED FROM AN AST SERVICE ROUTINE. ; ; NOTE: IF AN ADDRESS CHECK FAILURE OCCURS WHILE REMOVING ARGU- ; MENTS FROM THE TASK STACK, THEN THE ISSUING TASK IS ; ABORTED. ;- $DRATX::MOV (R2),-(SP) ;DIRECTIVE EXECUTED FROM AST? BPL 10$ ;IF PL NO BIC #^C*2>>,(SP) ;ISOLATE BITS BIC (SP),(R2) ;CLEAR AST IN PROGRESS FLAG ASR (SP) ;SET UP TASK'S CURRENT STATUS BITS BISB (SP)+,(R2) ;RESTORE PRE AST STATE BIT #T2.STP,(R2) ;WAS TASK STOPPED? BEQ 5$ ;IF EQ NO MOV T.PCB(R5),R0 ;POINT TO TASK PCB CALL $NXTSK ;REALLOCATE TASK PARTITION 5$: MFPI SP ;GET USER STACK POINTER MOV (SP)+,R0 ;RETRIEVE STACK POINTER ADD #2,R0 ;STEP OVER DPB WORD MOV #7*2,R1 ;SET NUMBER OF BYTES TO CHECK CALL $ACHCK ;ADDRESS CHECK TASK STACK WORDS BCS 20$ ;IF CS ADDRESS CHECK FAILURE .IF DF X$$HDR MOV H.EFSV(R4),-(SP) ;SAVE WAITFOR MASK FROM HEADER .IFTF CALL $RELOM ;RELOCATE AND MAP TASK STACK .IFT MOV (R0)+,4(SP) ;SET DIRECTIVE STATUS TO RETURN .IFF MOV (R0)+,2(SP) ;SET DIRECTIVE STATUS TO RETURN .ENDC MOV #$UMPC,R3 ;POINT TO SAVED USER PC MOV (R0)+,(R3)+ ;RESTORE PRE AST PC MOV (R0)+,(R3) ;RESTORE PRE AST PS MOV (R0)+,T.EFLM(R5) ;RESTORE WAITFOR MASK WORD MFPI SP ;RETRIEVE CURRENT STACK POINTER .IF DF S$$LIB BIS #PMODE,PS ;ASSUME RETURNING TO USER MODE BIS #CSMODE!PSMODE,(R3) ;FORCE RETURN PS TO AT LEAST SUPER BMI 9$ ;IF MI RETURN PS IS USER TSTB $SUPFL ;TASK USE SUPERVISOR MODE ? BNE 9$ ;IF NE YES, OK .ENDC ; DF S$$LIB BIS #CMODE!PMODE,(R3) ;MAKE SURE BOTH MODES ARE USER 9$: ADD #16,(SP) ;ADJUST STACK POINTER MTPI SP ;WRITE IT BACK BIC #PR7,(R3) ;MAKE SURE PRIORITY IS ZERO .IF DF X$$HDR MOV (SP)+,T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS MOV $SAHDB,KISAR6 ;RESTORE HEADER MAPPING .IFF MOV H.EFSV(R4),T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS .ENDC CALLR $SETRT ;FORCE A REDISPATCHING OF PROCESSOR 10$: DRSTS D.RS80 ;SET DIRECTIVE STATUS 20$: MOV #S.CAST,R0 ;SET AST ABORT CALLR $ABCTK ;ABORT CURRENT TASK .END